import Vue from 'vue'
import axios from 'axios'
import VueAxios from 'vue-axios'
// 导包
import { getToken, saveToken } from './token.js'
// 不是组件，使用toast轻弹窗和路由跳转需要导入
import { Toast } from 'vant'
import router from '@/router/index.js'

Vue.use(VueAxios, axios)

const instance = axios.create({
  // 基地址
  baseURL: 'http://toutiao.itheima.net',
  // 网络超时
  timeout: 10000
})

// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 如果有token就在请求拦截器中加入token,那么以后就不用再写接口是带上token，请求拦截器会自动帮你添加
    if (getToken())
      config.headers.Authorization = `Bearer ${getToken().token}`   // headers中有很多属性，我们只更改Authorization这一个属性
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    return response
  },
  async function (error) {
    console.dir(error)
    // 对响应错误做点什么
    // 1.先判断状态码是否为401
    if (error.response.status == 401) {
      // 2.在判断是否有token
      if (getToken()) {
        //   请求新的token不一定成功，需要用 try-catch 来捕获
        // 正确请求则正常后续过程
        try {
          // token过期，需要发送请求获得新的token
          /* 
                (1)此处使用axios发送请求，因为instance自己在 请求拦截器 里默认添加 token，而token是已经过期的，则会一直循环
                (2)使用instance发请求会自带token，而请求新的是需要 refresh_token 的，所以需要用axios发请求
            */
          //    使用异步，直接将请求回新token保存在 res 中
          let res = await axios({
            url: 'http://toutiao.itheima.net/v1_0/authorizations',
            method: 'put',
            headers: { Authorization: `Bearer ${getToken().refresh_token}` }
          })

          // 更新token
          let obj = getToken()
          obj.token = res.data.data.token
          saveToken(obj)

          //   更新token之后需要继续用户未完成的请求
          // 当发生错误时 error.config 保存了用户发送请求的信息，解决 token 后直接将参数传给instance继续请求，并return出去
          return instance(error.config)
          // 错误请求则说明refresh_token 也过期了，需要重新登录
        } catch (error) {
          // 如果失败，表示 refresh_token 也过期了，需要重新登录
          Toast.fail('请先登录')
          router.push({ path: '/login' })
        }
      } else {
        // 没有token，给出提示并跳转登录页
        Toast.fail('请先登录')
        router.push({ path: '/login' })
      }
    } else {
      // 错误码不是401，不做任何处理
    }

    return Promise.reject(error)
  }
)

// 导出instance
export default instance